﻿using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.Services;
using System.Xml;
using PAT.Data;
using PAT.Data.Bases;
using PAT.Entities;
using PAT.Services;
using PAT.Util;

public partial class aspx_rep02_ReporteOrdenes : System.Web.UI.Page
{
    #region Atributos
    private Common instanciaCommon = new Common();
    #endregion

    #region Eventos

    /// <summary>
    /// 
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            // Se cargan años desde el año presente hasta menos 60 años
            for (int i = DateTime.Now.Year; i >= (DateTime.Now.Year - 60); i--)
            {
                ddlAnoInicio.Items.Add(new ListItem(i.ToString(), i.ToString()));
                ddlAnoFin.Items.Add(new ListItem(i.ToString(), i.ToString()));
            }

            ddlAnoFin.SelectedValue = DateTime.Now.Year.ToString();
            ddlMesFin.SelectedValue = DateTime.Now.Month.ToString();

            ddlAnoInicio.SelectedValue = DateTime.Now.AddMonths(-6).Year.ToString();
            ddlMesInicio.SelectedValue = DateTime.Now.AddMonths(-6).Month.ToString();

            UtilUI.BindListControl(ddlTaller, instanciaCommon.GetTallerPorEstado(true), "IdTaller", "DescripcionTaller", true);
            UtilUI.BindListControl(ddlCargoOrden, instanciaCommon.GetCargoOrdenPorEstado(true), "IdCargoOrden", "DescripcionCargoOrden", true);
        }
    }

    [WebMethod]
    public static String GenerarReporteOrdenes(String IdCargoOrden, String MesInicio, String AnoInicio, String MesFin, String AnoFin, String IdTaller)
    {
        System.Globalization.DateTimeFormatInfo dtinfo = new System.Globalization.DateTimeFormatInfo();
        dtinfo.ShortDatePattern = ConfigurationManager.AppSettings["DateFormat"];
        dtinfo.DateSeparator = "/";

        DateTime fechaInicio = Convert.ToDateTime("01/" + MesInicio + "/" + AnoInicio, dtinfo);
        DateTime fechaFin = Convert.ToDateTime("01/" + MesFin + "/" + AnoFin, dtinfo).AddMonths(1).AddDays(-1);
        DateTime fechaPivot = fechaInicio;
        
        Reports instanciaReport = new Reports();
        Common instanciaCommon = new Common();

        DataSet dsReporteOrdenes = instanciaReport.GetReporteOrdenes((IdCargoOrden == String.Empty ? Convert.ToByte(0) : Convert.ToByte(IdCargoOrden)),
                                                                     fechaInicio,
                                                                     fechaFin,
                                                                     (IdTaller == String.Empty ? -1 : Convert.ToInt32(IdTaller)));

        //Se agregan las categorias que son los meses que se encuentran en la mitad de las fechas de inicio y fin y los valores que se encuentren el dataset

        // Se carga el xml base para construir el chart
        XmlDocument docQuery = new XmlDocument();
        docQuery.LoadXml("<chart><categories /></chart>");

        XmlNode nodeCategories = docQuery.SelectSingleNode("chart/categories");

        if (IdCargoOrden == String.Empty)
        {
            TList<PatCargoOrden> lstCargos = instanciaCommon.GetCargoOrdenPorEstado(true);
            while (fechaPivot <= fechaFin)
            {
                XmlNode category = docQuery.CreateElement("category");
                category.Attributes.SetNamedItem(CreateNewAttribute(docQuery, "label", fechaPivot.Year + "-" + fechaPivot.Month));
                nodeCategories.AppendChild(category);

                foreach (PatCargoOrden cargo in lstCargos)
                {
                    XmlNode nodeDataset = null;
                    if (docQuery.SelectSingleNode(String.Format("/chart/dataset[@seriesName='{0}']", cargo.DescripcionCargoOrden)) == null)
                    {
                        nodeDataset = docQuery.CreateElement("dataset");
                        nodeDataset.Attributes.SetNamedItem(CreateNewAttribute(docQuery, "seriesName", cargo.DescripcionCargoOrden));
                        docQuery.SelectSingleNode("/chart").AppendChild(nodeDataset);
                    }
                    else
                        nodeDataset = docQuery.SelectSingleNode(String.Format("/chart/dataset[@seriesName='{0}']", cargo.DescripcionCargoOrden));

                    XmlNode nodeValue = docQuery.CreateElement("set");
                    if (dsReporteOrdenes.Tables[0].Compute("COUNT(NUMERO_ORDEN)", String.Format("MesCreacion='{0}' AND AnoCreacion='{1}' AND ID_CARGO_ORDEN='{2}'", fechaPivot.Month.ToString(), fechaPivot.Year.ToString(), cargo.IdCargoOrden.ToString())) != null)
                        nodeValue.Attributes.SetNamedItem(CreateNewAttribute(docQuery, "value", Convert.ToInt32(dsReporteOrdenes.Tables[0].Compute("COUNT(NUMERO_ORDEN)", String.Format("MesCreacion='{0}' AND AnoCreacion='{1}' AND ID_CARGO_ORDEN='{2}'", fechaPivot.Month.ToString(), fechaPivot.Year.ToString(), cargo.IdCargoOrden.ToString()))).ToString()));
                    else
                        nodeValue.Attributes.SetNamedItem(CreateNewAttribute(docQuery, "value", "0"));

                    nodeDataset.AppendChild(nodeValue);
                }

                fechaPivot = fechaPivot.AddMonths(1);
            }
        }
        else
        {
            PatCargoOrden instCargo = instanciaCommon.GetCargoOrdenPorId(Convert.ToByte(IdCargoOrden));

            XmlNode nodeDataset = docQuery.CreateElement("dataset");
            nodeDataset.Attributes.SetNamedItem(CreateNewAttribute(docQuery, "seriesName", instCargo.DescripcionCargoOrden));
            docQuery.SelectSingleNode("/chart").AppendChild(nodeDataset);

            while (fechaPivot <= fechaFin)
            {
                XmlNode category = docQuery.CreateElement("category");
                category.Attributes.SetNamedItem(CreateNewAttribute(docQuery, "label", fechaPivot.Year + "-" + fechaPivot.Month));
                nodeCategories.AppendChild(category);

                XmlNode nodeValue = docQuery.CreateElement("set");
                if (dsReporteOrdenes.Tables[0].Compute("COUNT(NUMERO_ORDEN)", String.Format("MesCreacion='{0}' AND AnoCreacion='{1}' AND ID_CARGO_ORDEN='{2}'", fechaPivot.Month.ToString(), fechaPivot.Year.ToString(), instCargo.IdCargoOrden.ToString())) != null)
                    nodeValue.Attributes.SetNamedItem(CreateNewAttribute(docQuery, "value", Convert.ToInt32(dsReporteOrdenes.Tables[0].Compute("COUNT(NUMERO_ORDEN)", String.Format("MesCreacion='{0}' AND AnoCreacion='{1}' AND ID_CARGO_ORDEN='{2}'", fechaPivot.Month.ToString(), fechaPivot.Year.ToString(), instCargo.IdCargoOrden.ToString()))).ToString()));
                else
                    nodeValue.Attributes.SetNamedItem(CreateNewAttribute(docQuery, "value", "0"));

                nodeDataset.AppendChild(nodeValue);
                fechaPivot = fechaPivot.AddMonths(1);
            }
        }

        return docQuery.OuterXml.Replace('"', '\'');
    }

    public static XmlAttribute CreateNewAttribute(XmlDocument parent, String nameAttribute, String valueAttribute)
    {
        XmlAttribute attr = parent.CreateAttribute(nameAttribute);
        attr.Value = valueAttribute;
        return attr;
    }
    #endregion
}
